import re
from django.contrib.auth.backends import ModelBackend
from itsdangerous import BadData

from apps.users.models import User

"""
我们的需求是用户名或者手机号登陆 系统默认提供的是用户名
当系统的类/方法 不能满足我们的需求的时候  就继承重写
"""

# 抽取封装

def get_user_by_username(username):
    try:
        if re.match(r'1[3-9]\d{9}', username):
            user = User.objects.get(mobile=username)
        else:
            user = User.objects.get(username=username)
    except User.DoesNotExist:
        return None
    return user


class UsernameModelBackend(ModelBackend):

    def authenticate(self, request, username=None, password=None, **kwargs):
        # username有可能是用户名 也有有可能是手机号
        # 如果用户名 我们查询的时候应该根据用户名进行查询
        # 如果是手机号  我们查询的时候应该根据手机号查询
        # 1.需要区分用户名和手机号
        # try:
        #     if re.match(r'1[3-9]\d{9}',username):
        #         user=User.objects.get(mobile=username)
        #     else:
        #         user=User.objects.get(username=username)
        # except User.DoesNotExist:
        #     return None
        # 2.根据用户提供的信息 验证密码
        user=get_user_by_username(username)
        if user is not None and user.check_password(password):
            return user
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from meiduo import settings

def generic_verify_email_url(user_id):

    #1.创建实例对象
    s = Serializer(secret_key=settings.SECRET_KEY,expires_in=3600)
    #2.组织数据
    data = {
        'user_id':user_id
    }

    #3.加密数据
    token = s.dumps(data)
    #4.返回数据

    return settings.EMAIL_VERIFY_URL+'?token=' +token.decode()


def check_veryfy_email_token(token):

    # 1.创建实例对象
    s = Serializer(secret_key=settings.SECRET_KEY,expires_in=3600)

    # 2.对数据进行解密，解密的时候可能有异常
    try:
        result = s.loads(token)
    except BadData:
        return None
    # 3.返回数据
    return result.get('user_id')